package cn.jasonone.him.service;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

import org.springframework.web.multipart.MultipartFile;

import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.HandshakeData;
import com.corundumstudio.socketio.SocketIOClient;

import cn.jasonone.him.HimConst;
import cn.jasonone.him.model.HimFriend;
import cn.jasonone.him.model.HimGroup;
import cn.jasonone.him.model.HimUserInfo;
import cn.jasonone.him.model.Message;

/**
 * Him主要业务接口
 * 
 * @author Jason
 *
 */
public interface HimService extends HimConst,Serializable {

	/**
	 * 监听好友消息事件
	 * 
	 * @param client  客户端对象
	 * @param request 客户端消息回复对象
	 * @param message 消息对象
	 */
	default void messageFriend(SocketIOClient client, AckRequest request, Message message) {
	}

	/**
	 * 监听群消息事件
	 * 
	 * @param client  客户端对象
	 * @param request 客户端消息回复对象
	 * @param message 消息对象
	 */
	default void messageGroup(SocketIOClient client, AckRequest request, Message message) {
	}

	/**
	 * 监听系统消息事件
	 * 
	 * @param client  客户端对象
	 * @param request 客户端消息回复对象
	 * @param message 消息对象
	 */
	default void messageSystem(SocketIOClient client, AckRequest request, Message message) {
	}

	/**
	 * 用户上线事件,用来绑定用户信息
	 * 
	 * @param client 当前用户的Socket
	 * @return 用户对象
	 */
	default HimUserInfo connection(SocketIOClient client) {
		return new HimUserInfo().setId(client.getSessionId().toString()).setUsername("测试账号");
	}

	/**
	 * 用户离线事件
	 * @param client 客户端对象
	 * @param user 离线用户对象
	 */
	default void disconnection(SocketIOClient client, HimUserInfo user) {
		
	}

	/**
	 * 权限鉴定
	 * 
	 * @param data 数据对象
	 * @return 鉴定结果: 成功为True,否则为False
	 */
	default boolean isAuthorization(HandshakeData data) {
		return true;
	}

	/**
	 * 根据用户ID查询当前用户信息
	 * 
	 * @param userId 用户ID
	 * @return 用户信息
	 */
	default HimUserInfo findMine(String userId) {
		return null;
	}

	/**
	 * 根据群ID,查询群信息
	 * 
	 * @param groupId 群ID
	 * @return 群信息
	 */
	default HimGroup findGroupById(String groupId) {
		return null;
	}

	/**
	 * 根据用户ID查询用户好友列表
	 * 
	 * @param userId 用户ID
	 * @return 好友列表
	 */
	default List<HimFriend> findFriends(String userId) {
		return Collections.emptyList();
	}

	/**
	 * 根据用户ID查询用户所在群组列表
	 * 
	 * @param userId 用户ID
	 * @return 群组列表
	 */
	default List<HimGroup> findGroups(String userId) {
		return Collections.emptyList();
	}

	/**
	 * 上传图片
	 * 
	 * @param file 文件对象
	 * @return 图片访问URL
	 * @throws Exception 图片保存发生错误时抛出
	 */
	default String uploadImage(MultipartFile file) throws Exception{
		return null;
	}

	/**
	 * 上传文件
	 * 
	 * @param file 文件对象
	 * @return 文件访问URL
	 * @throws Exception 文件保存发生错误时抛出
	 */
	default String uploadFile(MultipartFile file) throws Exception{
		return null;
	}

}
